# -*- coding: utf-8 -*-
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#作者：cacho_37967865
#博客：https://blog.csdn.net/sinat_37967865
#文件：tensorflow_base.py
#日期：2019-11-11
#备注：Tensorflow的一些基础知识：构建图-->启动图-->
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

import tensorflow as tf

import os
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2'      # 只显示 warning 和 Error


def start_session():
    # 构建图
    matrix1 = tf.constant([[3., 3.]])          # 常量op 产生一个1x2矩阵. 这个op被作为一个节点
    matrix2 = tf.constant([[2.],[2.]])         # 常量op 产生一个2x1矩阵
    product = tf.matmul(matrix1, matrix2)      # 创建一个矩阵乘法 matmul op

    # 在一个会话中启动图
    '''''''''
    sess = tf.Session()                        # 启动默认图
    result = sess.run(product)
    print(result)
    sess.close()  # 任务完成, 关闭会话
    '''''''''
    # 代码块在一个会话中启动图
    with tf.Session() as sess:
        result = sess.run(product)
        print(result)              # # ==> [[ 12.]]


def interactive_session():
    sess = tf.InteractiveSession()         # 进入一个交互式 TensorFlow 会话,不需要with...as
    x = tf.Variable([1.0, 2.0])            # 创建一个变量 op
    a = tf.constant([3.0, 3.0])
    x.initializer.run()                    # 使用初始化器 initializer op 的 run() 方法初始化 'x'
    sub = tf.subtract(x, a)                # 减法 op  从'x' 减去 'a'
    sess.run(tf.global_variables_initializer())
    print(sub.eval())                      # ==> [-2. -1.]


# 变量需要global_variables_initializer初始化
def variable_run():
    state = tf.Variable(0, name="counter")       # 创建一个变量, 初始化为标量0
    # 创建一个 op, 其作用是使 state 增加 1
    one = tf.constant(1)
    new_value = tf.add(state, one)
    update = tf.assign(state, new_value)         # 调用 run()执行表达式之前, 它并不会真正执行赋值操作
    init_op = tf.global_variables_initializer()  # 增加一个`初始化` op 到图中
    with tf.Session() as sess:
        sess.run(init_op)                        # 运行 'init' op
        print(sess.run(state))                   # ==> 0
        for _ in range(3):
            sess.run(update)
            print(sess.run(state))               # ==> 1  2  3


# 可以取回多个tensor
def fetch_run():
    input1 = tf.constant(3.0)
    input2 = tf.constant(2.0)
    input3 = tf.constant(5.0)
    intermed = tf.add(input2, input3)       # 2.0+5.0=7.0
    mul = tf.multiply(input1, intermed)     # 3.0*7.0=21.0

    with tf.Session() as sess:
        result = sess.run([mul, intermed])
        print(result)                      # ==> [21.0, 7.0]


# feed使用一个tensor值临时替换一个操作的输出结果
def feed_run():
    input1 = tf.placeholder(tf.float32)     # 使用tf.placeholder()为这些操作创建占位符
    input2 = tf.placeholder(tf.float32)
    output = tf.multiply(input1, input2)

    with tf.Session() as sess:
        result = sess.run([output], feed_dict={input1: [7.], input2: [2.]})
        print(result)                      # ==> [array([14.], dtype=float32)]


if __name__ == '__main__':
    #start_session()
    interactive_session()
    #variable_run()
    #fetch_run()
    #feed_run()